#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include "../list.h"

// 整数比较函数
int compareInt(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

// 打印整数列表
void printIntList(List* list) {
    printf("[");
    for (size_t i = 0; i < list->size; i++) {
        int* value = ListGet(list, i);
        if (value != NULL) {
            printf("%d", *value);
        } else {
            printf("NULL");
        }
        if (i < list->size - 1) {
            printf(", ");
        }
    }
    printf("]\n");
}

// 基本功能测试
void testBasicFunctionality() {
    printf("=== 基本功能测试 ===\n");
    
    // 创建新列表
    List* list = ListNew();
    printf("创建空列表，大小: %zu\n", list->size);
    
    // 添加整数元素
    int* values = malloc(5 * sizeof(int));
    for (int i = 0; i < 5; i++) {
        values[i] = i * 10;
        // 直接传递整数指针作为void*值
        ListAdd(list, &values[i]);
    }
    
    printf("添加5个元素后，大小: %zu\n", list->size);
    printf("列表内容: ");
    printIntList(list);
    
    // 测试ListGet
    printf("获取元素: ");
    for (int i = 0; i < 3; i++) {
        int* value = ListGet(list, i);
        if (value != NULL) {
            printf("索引%d=%d ", i, *value);
        }
    }
    printf("\n");
    
    // 测试ListSet
    int newValue = 999;
    ListSet(list, 2, &newValue);
    printf("设置索引2为999后: ");
    printIntList(list);
    
    // 清理
    free(values);
    ListFree(list);
    printf("\n");
}

// 测试查找功能
void testSearchFunctionality() {
    printf("=== 查找功能测试 ===\n");
    
    List* list = ListNew();
    int values[] = {10, 20, 30, 20, 40};
    
    // 添加元素
    for (int i = 0; i < 5; i++) {
        ListAdd(list, &values[i]);
    }
    
    printf("列表内容: ");
    printIntList(list);
    
    // 测试查找
    int searchValue = 20;
    printf("查找值%d是否存在: %s\n", searchValue, 
           ListHas(list, &searchValue, compareInt) ? "是" : "否");
    
    printf("值%d的第一个索引: %d\n", searchValue, 
           ListIndex(list, &searchValue, compareInt));
    
    printf("值%d在列表中出现次数: %d\n", searchValue, 
           ListCountValue(list, &searchValue, compareInt));
    
    // 测试删除指定值
    printf("删除第一个值%d后: ", searchValue);
    ListRemove(list, &searchValue, compareInt);
    printIntList(list);
    
    ListFree(list);
    printf("\n");
}

// 测试删除功能
void testDeleteFunctionality() {
    printf("=== 删除功能测试 ===\n");
    
    List* list = ListNew();
    int values[] = {10, 20, 30, 40, 50};
    
    // 添加元素
    for (int i = 0; i < 5; i++) {
        ListAdd(list, &values[i]);
    }
    
    printf("原始列表: ");
    printIntList(list);
    
    // 删除单个元素
    ListDelete(list, 2);
    printf("删除索引2后: ");
    printIntList(list);
    
    // 删除范围
    ListDeleteRange(list, 0, 1);
    printf("删除索引0到1后: ");
    printIntList(list);
    
    // 清空列表
    ListClear(list);
    printf("清空列表后大小: %zu\n", list->size);
    
    ListFree(list);
    printf("\n");
}

// 测试扩展和复制
void testExtendCopy() {
    printf("=== 扩展和复制测试 ===\n");
    
    List* list1 = ListNew();
    List* list2 = ListNew();
    
    int values1[] = {10, 20, 30};
    int values2[] = {40, 50, 60};
    
    // 添加元素
    for (int i = 0; i < 3; i++) {
        ListAdd(list1, &values1[i]);
        ListAdd(list2, &values2[i]);
    }
    
    printf("列表1: ");
    printIntList(list1);
    printf("列表2: ");
    printIntList(list2);
    
    // 扩展列表1
    ListExtend(list1, list2);
    printf("扩展列表1后: ");
    printIntList(list1);
    
    // 复制列表
    List* copy = ListCopy(list1);
    printf("复制列表: ");
    printIntList(copy);
    
    // 清理
    ListFree(list1);
    ListFree(list2);
    ListFree(copy);
    printf("\n");
}

// 测试数组创建
void testFromArray() {
    printf("=== 从数组创建测试 ===\n");
    
    int values[] = {100, 200, 300, 400};
    void* array[4];
    
    // 创建指针数组
    for (int i = 0; i < 4; i++) {
        array[i] = &values[i];
    }
    
    List* list = ListFromArray(array, 4);
    printf("从数组创建的列表: ");
    printIntList(list);
    
    ListFree(list);
    printf("\n");
}

// 测试错误处理
void testErrorHandling() {
    printf("=== 错误处理测试 ===\n");
    
    // 测试NULL指针
    printf("测试NULL列表:\n");
    ListAdd(NULL, NULL);
    printf("ListGet(NULL, 0) = %p\n", ListGet(NULL, 0));
    
    // 创建一个列表用于测试
    List* list = ListNew();
    int value = 100;
    ListAdd(list, &value);
    
    // 测试索引越界
    printf("\n测试索引越界:\n");
    printf("ListGet(list, 10) = %p\n", ListGet(list, 10));
    printf("ListGet(list, -1) = %p\n", ListGet(list, -1));
    
    // 测试切片步长为0
    printf("\n测试切片步长为0:\n");
    List* invalidSlice = ListSlice(list, 0, 1, 0);
    printf("ListSlice步长为0返回: %p\n", invalidSlice);
    
    ListFree(list);
    printf("\n");
}

int main() {
    // 设置区域为中文UTF-8
    setlocale(LC_ALL, "zh_CN.UTF-8");
    printf("开始测试List库...\n\n");
    
    testBasicFunctionality();
    testSearchFunctionality();
    testDeleteFunctionality();
    testExtendCopy();
    testFromArray();
    testErrorHandling();
    
    printf("所有测试完成！\n");
    return 0;
}